﻿using System;
using System.Collections.Generic;
using System.Text;
using System.Linq;
using System.Data;
using ForrajeriaDB; //ESTE USING VA EN TODOS LOS ELEMENTOS DE ESTA CAPA
using System.Configuration;
using System.Data.SqlClient; //using para oledb 


namespace ForrajeriaDAL
{
    /* CLASE PADRE DE LAS QUE HEREDAN TODAS LAS DEMAS POSEE LOS METODOS PARA DEVOLVER EL CONTEXTO DE LA BD ASI COMO TAMBIEN UN ARRAY EN RELACION A UNA CONSULTA    */
    public abstract class AccesoDAL
    {
        private  static SqlConnection conexion;
        private SqlTransaction transaccion;
        private string micadena;
        
        public AccesoDAL()
        {
            string asd = Environment.MachineName; //ESTA SENTENCIA OBTIENE EL NOMBRE DE LA MAQUINA SOBRE LA QUE ESTA EL SERVIDOR 

            switch (asd)
            {
                

                case "MARTINPC": //martin
                    micadena = (string)ConfigurationManager.ConnectionStrings["martinCon"].ConnectionString;
                    break;

                case "DESKTOP-FRI": //Nacho
                    micadena = (string)ConfigurationManager.ConnectionStrings["NachoCon"].ConnectionString;
                    break;

                case "EZEPC": //Eze
                    micadena = (string)ConfigurationManager.ConnectionStrings["EzeCon"].ConnectionString;
                    break;


                default:
                    throw new Exception("Hay que configurar la cadena de conexion en el web CONFIG TMB! si esta echo y no anda hay problemas :)");

            }
            
            
            if (conexion == null) //al ser estatico el atributo si ya existe no hace falta pisar el objeto existente.
            {
                conexion = new SqlConnection(micadena);
            }

        }

        protected SqlConnection getConexion()
        {
            return conexion;
        }

        protected string getCadena()
        {
            return micadena;
        }
        
        protected void opencon()
        {
            conexion.Open();
        }

        protected void closecon()
        {
            conexion.Close();
        }

        protected SqlTransaction getTransaccion()
        {
            if (transaccion != null)
            {
                transaccion = conexion.BeginTransaction();
            }
            return transaccion;
        }

        protected string commitTran()
        {
            try
            {
                transaccion.Commit();
            }
            catch (DataException ex)
            {
                throw ex;
            }
            catch (SqlException ex)
            {
                throw ex;
            }

            catch (Exception ex)
            {
                return "Error no reconocido!";
            }

            return "ok";
        }

        protected String rollTran()
        {
            try
            {
                transaccion.Rollback();
            }
            catch (DataException ex)
            {
                throw ex;
            }
            catch (SqlException ex)
            {
                throw ex;
            }

            catch (Exception ex)
            {
                return "Error no reconocido!";
            }


            return "ok";
        }

        protected int getCodigoInsert(string tabla, string pk)
        {
            int retorno;
            SqlCommand cmd;
            cmd = new SqlCommand("GetMaxPK", getConexion());
            cmd.CommandType = CommandType.StoredProcedure;

            cmd.Parameters.Add("@tabla", SqlDbType.VarChar, 50).Value = tabla;
            cmd.Parameters.Add("@clave", SqlDbType.VarChar, 50).Value = pk;
            try
            {

                opencon();
                retorno = int.Parse(cmd.ExecuteScalar().ToString());
                closecon();
                return retorno;
            }
            catch (Exception ex)
            {
                closecon();
                return -1;
            }
        }

        protected void closeReader(SqlDataReader rea) //metodo que cierra el datareader luego de realizar una consulta del tipo SELECT o get o blablabla 
        { if (rea != null) rea.Close(); }

    }
}
